#ifndef __PROTOCOL_H
#define __PROTOCOL_H

#ifdef __cplusplus
extern "C" {
#endif

#include "def.h"

#define DATALEN 512
#define PROTOCOLBEGIN 0x1
#define PROTOCOLHEADLEN 3
#define PROTOCOLDATALEN(x) (x - 5) /* x为收到的len */
#define PROTOCOLSENDLEN(x) (x + 5) /* x为数据域长度 */

enum {
    STATE_OK = 0,
    STATE_ERR,
    STATE_MAX
};

typedef void(*protocolfunc)(u8*, u16);
typedef void(*sendfunc)(u8*, u16);
typedef protocolfunc(*findfunc)(u8, u8);
typedef void (*printfFun)(const char *, ...);

typedef struct 
{
    u8 begin; /* 协议开始 */
    u8 len_l; /* 数据长度（除检验） */
    u8 len_h; /* 数据长度（除检验） */
    u8 funcode_l; /* 功能码 */
    u8 funcode_h; /* 功能码 */
    u8 data[1]; /* 数据域 */
    u8 checksum; /* 检验和 */
} ProtocolStru;

typedef struct 
{
    sendfunc protoColSend;
    findfunc protoColFind;
    u8 isData;
    u8 protocolBuf[DATALEN];
    u8 protocolTxBuf[50];    
    u16 protocolRecLen;
    u16 currIndex;
} ProtocolCtrlStru;

typedef struct 
{
    u8 funcode_l;
    u8 funcode_h;
    protocolfunc func;
} ProtocolFuncStru;

#define FUNCODEL_CONNECT 1

#define FUNCODEH_UDATA_ID         1
#define FUNCODEH_SET_ID           2
#define FUNCODEH_UDATACONFIG      3
#define FUNCODEH_SET_CONNECTSTATE 4
#define FUNCODEH_DOWNLOAD_DATA    5

#define FUNCODEH_STATUS 1
#define FUNCODEH_INIT   2

void ProtoColInit(ProtocolCtrlStru  *ctrl, sendfunc p, printfFun func);
void ProtoColTask(ProtocolCtrlStru  *ctrl);
u8 ProtoColSend(ProtocolCtrlStru  *ctrl, u8 funcode_l, u8 funcode_h, u8* data, u16 len);
u8 ProtoColGetData(ProtocolCtrlStru  *ctrl, u8 *data, u16 len);
ProtocolCtrlStru* ProtocolGetCtrl(void);
u8 ProtoColCheckSum(u8 *data, u16 len);
u8 ProtoColGetDataByHttp(ProtocolCtrlStru  *ctrl, u8 cmdIndex, u8 *data, u16 len);

#ifdef __cplusplus
}
#endif

#endif
